﻿#region File Description
///------------------------------------------------------------------
/// Program		  :	Algorithm With Graph
/// Written by	  :	Nguyen Khac Trung, Le Hoang Tuan
/// Email		  :	nkt1321991@gmail.com || hoangtuanuit@gmail.com
/// File Name     : MainWindow.xaml.cs
/// Created date  :	10/11/2011
/// Modified by	  :	Nguyen Khac Trung
/// Modified date :	11/11/2011
/// Version		  :	1.2
/// Description	  :	
///------------------------------------------------------------------
#endregion

#region Using Statements

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using System.Diagnostics;
using System.Reflection;
using System.Resources;

#endregion


namespace Graph
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    ///
    public partial class MainWindow : Window
    {

        #region Fields
        //Danh sách các item gồm path và point
        MyItemList m_listMyItem;

        private int m_selectIndex;
        //Ma trận kề
        private int[,] m_matrix;

        #endregion

        #region Initialization

        public MainWindow()
        {
            InitializeComponent();
            m_selectIndex = 0;
            m_listMyItem = new MyItemList(panelViewMain, panelViewMainBack, this.panelViewMain);
            panelViewMain.ContextMenu = new System.Windows.Controls.ContextMenu();
            m_matrix = null;
        }

        #endregion

        #region Process Click
        //Xử lý sự kiện nhấn chuột trái vài màn hình chính
        private void panelViewMain_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            switch (m_selectIndex)
            {
                case 1:
                    m_listMyItem.LISTMYPATHINLISTITEM.ResetCollectData();
                    break;
                case 2:
                    m_listMyItem.LISTMYPATHINLISTITEM.ResetCollectData();
                    m_listMyItem.AddPointToMyList(checkBoxNamePoint.IsChecked);
                    ShowTextBoxViewMain(1);
                    break;
                case 3:
                    m_listMyItem.AddLineToMyList();
                    ShowTextBoxViewMain(1);
                    break;
                case 4:
                    m_listMyItem.AddCircleToMyList();
                    ShowTextBoxViewMain(1);
                    break;
                case 6:
                    m_listMyItem.LISTMYPATHINLISTITEM.ResetCollectData();
                    m_listMyItem.RemovePointToMyList();
                    ShowTextBoxViewMain(1);
                    break;
                default:
                    m_listMyItem.LISTMYPATHINLISTITEM.ResetCollectData();
                    break;
            }
        }
        //Xử lý sự kiện click vào các nút trên hộp công cụ Vẽ
        private void panelToolDraw_Click(object sender, RoutedEventArgs e)
        {
            FrameworkElement fe = (FrameworkElement)e.Source;
            switch (fe.Name)
            {
                case "btn_Cursor":
                    m_listMyItem.LISTMYPOINTINLISTITEM.resetColorStroke();
                    ShowTextBoxGuild(1);
                    m_selectIndex = 1;
                    break;
                case "btn_Point":
                    m_listMyItem.LISTMYPOINTINLISTITEM.resetColorStroke();
                    textBoxResult.Clear();
                    textBoxViewerResult.Clear();
                    ShowTextBoxGuild(2);
                    m_selectIndex = 2;
                    break;
                case "btn_Path":
                    m_listMyItem.LISTMYPOINTINLISTITEM.resetColorStroke();
                    textBoxResult.Clear();
                    textBoxViewerResult.Clear();
                    ShowTextBoxGuild(3);
                    m_selectIndex = 3;
                    break;
                case "btn_Circle":
                    m_listMyItem.LISTMYPOINTINLISTITEM.resetColorStroke();
                    textBoxResult.Clear();
                    textBoxViewerResult.Clear();
                    ShowTextBoxGuild(4);
                    m_selectIndex = 4;
                    break;
                case "btn_DeletePoint":
                    m_listMyItem.LISTMYPOINTINLISTITEM.resetColorStroke();
                    textBoxResult.Clear();
                    textBoxViewerResult.Clear();
                    m_selectIndex = 6;
                    ShowTextBoxGuild(5);
                    break;
                case "btn_DeleteLine":
                    m_listMyItem.LISTMYPOINTINLISTITEM.resetColorStroke();
                    textBoxResult.Clear();
                    textBoxViewerResult.Clear();
                    ShowTextBoxGuild(6);
                    m_selectIndex = 7;
                    break;
                case "btn_Clear":
                    m_listMyItem.LISTMYPOINTINLISTITEM.resetColorStroke();
                    ClearToNew();
                    textBoxResult.Clear();
                    textBoxViewerResult.Clear();
                    ShowTextBoxGuild(7);
                    m_selectIndex = 8;
                    break;
                default:
                    m_listMyItem.LISTMYPOINTINLISTITEM.resetColorStroke();
                    textBoxResult.Clear();
                    textBoxViewerResult.Clear();
                    break;
            }
        }
        //Xử lý sự kiện nhấn chuột phải vào màn hình chính để tạo 1 contextMenu xóa đường
        private void panelViewMain_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (m_selectIndex == 7)
            {
                int index = m_listMyItem.LISTMYPOINTINLISTITEM.IsClickMyPoint(10);
                if (index == -1)
                {
                    return;
                }

                ContextMenu contextMenu = new ContextMenu();
                panelViewMain.ContextMenu = contextMenu;

                String str = m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[index].ELL.Name;
                int i = 0;

                foreach (MyPath path in m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH)
                {
                    if (path.NAMEFIRSTPOINT == str || path.NAMEENDPOINT == str)
                    {
                        MenuItem menuItem = new MenuItem();
                        menuItem.Name = path.MYPATH.Name;
                        menuItem.Header = path.MYPATH.Name;
                        menuItem.MouseMove += new MouseEventHandler(menuItem_MouseMove);
                        menuItem.MouseLeave += new MouseEventHandler(menuItem_MouseLeave);
                        menuItem.Click += new RoutedEventHandler(menuItem_Click);

                        contextMenu.Items.Add(menuItem);

                        ++i;
                    }
                }

                if (i == 0)
                {
                    MenuItem menuItem = new MenuItem();
                    menuItem.Header = "None";
                    contextMenu.Items.Add(menuItem);
                }
            }
            else
            {
                panelViewMain.ContextMenu.Visibility = Visibility.Hidden;
            }

        }

        void menuItem_Click(object sender, RoutedEventArgs e)
        {
            FrameworkElement fe = (FrameworkElement)e.Source;
            int index = m_listMyItem.SearchIndex(fe.Name);

            m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH.RemoveAt(m_listMyItem.LISTMYPATHINLISTITEM.SearchIndex(fe.Name));
            m_listMyItem.LISTMYITEM.RemoveAt(index);
            panelViewMain.Children.RemoveAt(index);
            ShowTextBoxViewMain(1);

            panelViewMain.ContextMenu.Visibility = Visibility.Hidden;
        }

        void menuItem_MouseLeave(object sender, MouseEventArgs e)
        {
            FrameworkElement fe = (FrameworkElement)e.Source;
            m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH[m_listMyItem.LISTMYPATHINLISTITEM.SearchIndex(fe.Name)].MYPATH.Stroke = Brushes.Black;
        }

        void menuItem_MouseMove(object sender, MouseEventArgs e)
        {
            FrameworkElement fe = (FrameworkElement)e.Source;
            m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH[m_listMyItem.LISTMYPATHINLISTITEM.SearchIndex(fe.Name)].MYPATH.Stroke = Brushes.Red;
        }
        //Xử lý sự kiện click vào các nút trên Menu
        private void panelMenu_Click(object sender, RoutedEventArgs e)
        {
            FrameworkElement fe = (FrameworkElement)e.Source;
            switch (fe.Name)
            {
                case "btn_New":
                    NewFile();
                    break;
                case "btn_Open":
                    OpenFile();
                    break;
                case "btn_Save":
                    SaveFile();
                    break;
                case "btn_Info":
                    ShowInfo();
                    break;
                case "btn_Exit":
                    Exit();
                    break;
                default:
                    break;
            }
        }

        private void comboBoxFunctionGraph_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            switch (comboBoxFunctionGraph.SelectedIndex)
            {
                case 0:
                    break;
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                    btn_RunGraph.IsEnabled = true;
                    break;
                default:
                    btn_RunGraph.IsEnabled = true;
                    break;
            }
        }

        private void btn_runGraph_Click(object sender, RoutedEventArgs e)
        {
            textBoxResult.Clear();
            textBoxViewerResult.Clear();
            switch (comboBoxFunctionGraph.SelectedIndex)
            {
                case 0:
                    m_listMyItem.LISTMYPOINTINLISTITEM.resetColorStroke();
                    break;
                case 1:
                    Reset();
                    ShowTextBoxResult(1);
                    ShowTextBoxGuild(8);
                    try
                    {
                        ShowMatrix();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.ToString());
                    }
                    
                    break;
                case 2:
                    Reset();
                    ShowTextBoxResult(2);
                    ShowTextBoxGuild(9);
                    try
                    {
                        ShowDepthFirstSearch();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.ToString());
                    }
                    break;
                case 3:
                    Reset();
                    ShowTextBoxResult(3);
                    ShowTextBoxGuild(10);
                    try
                    {
                        ShowBreadthFirstSearch();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.ToString());
                    }
                    break;
                case 4:
                    Reset();
                    ShowTextBoxResult(4);
                    ShowTextBoxGuild(11);
                    try
                    {
                        ShowFindWay(0);
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.ToString());
                    }
                    break;
                case 5: 
                    Reset();
                    ShowTextBoxResult(5);
                    ShowTextBoxGuild(12);
                    try
                    {
                        ShowFindWay(1);
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.ToString());
                    }
                    break;
                case 6:
                    Reset();
                    ShowTextBoxResult(6);
                    ShowTextBoxGuild(13);
                    try
                    {
                        ShowEulerCycle();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.ToString());
                    }
                    break;
                case 7:
                    Reset();
                    ShowTextBoxResult(7);
                    ShowTextBoxGuild(14);
                    try
                    {
                        ShowEulerPath();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.ToString());
                    }
                    break;
                case 8:
                    Reset();
                    ShowTextBoxResult(8);
                    ShowTextBoxGuild(15);
                    try
                    {
                        ShowHamiltonCycle();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.ToString());
                    }
                    break;
                case 9:
                    Reset();
                    ShowTextBoxResult(9);
                    ShowTextBoxGuild(16);
                    try
                    {
                        ShowHamiltonPath();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.ToString());
                    }
                    break;
                default:
                    m_listMyItem.LISTMYPOINTINLISTITEM.resetColorStroke();
                    break;
            }
        }
        //Xử lý sự kiện nhấn vào các hình demo
        private void StackPanel_Click(object sender, RoutedEventArgs e)
        {
            panelViewMain.Children.Clear();
            textBoxViewerMain.Clear();
            panelViewMainBack.Children.RemoveRange(1, panelViewMainBack.Children.Count - 1);
            textBoxResult.Clear();
            textBoxViewerResult.Clear();
            textBoxGuild.Clear();
            FrameworkElement fe = (FrameworkElement)e.Source;
            switch (fe.Name)
            {
                case "btn_Demo1":
                    LoadDemo(1);
                    break;
                case "btn_Demo2":
                    LoadDemo(2);
                    break;
                case "btn_Demo3":
                    LoadDemo(3);
                    break;
                case "btn_Demo4":
                    LoadDemo(4);
                    break;
                case "btn_Demo5":
                    LoadDemo(5);
                    break;
                case "btn_Demo6":
                    LoadDemo(6);
                    break;
                case "btn_Demo7":
                    LoadDemo(7);
                    break;
                case "btn_Demo8":
                    LoadDemo(8);
                    break;
                case "btn_Demo9":
                    LoadDemo(9);
                    break;
                case "btn_Demo10":
                    LoadDemo(10);
                    break;
                default:
                    break;
            }
            
        }

        #endregion

        #region Process Algorithm

        private void SaveFile()
        {
            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            dlg.FileName = "Graph";
            dlg.DefaultExt = ".text";
            dlg.Filter = "Data file |*.txt";

            Nullable<bool> result = dlg.ShowDialog();
            
            if (result == true)
            {
                String fileName = dlg.FileName;
                TextWriter textWriter = new StreamWriter(fileName);
                int n = m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count;
                if (n == 0)
                {
                    textWriter.WriteLine("Point None");
                }
                else
                {
                    textWriter.WriteLine(n.ToString());
                    for (int i = 0; i < n; ++i)
                    {
                        textWriter.WriteLine(m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[i].ELL.Name + " " +
                                                m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[i].ELL.X.ToString() + " " +
                                                m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[i].ELL.Y.ToString());
                    }
                }

                n = m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH.Count;
                if (n == 0)
                {
                    textWriter.WriteLine("Path None");
                }
                else
                {
                    textWriter.WriteLine(n.ToString());
                    for (int i = 0; i < n; ++i)
                    {
                        textWriter.WriteLine(m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH[i].MYPATH.Name + " " +
                                                m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH[i].NAMEFIRSTPOINT + " " +
                                                m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH[i].NAMEENDPOINT + " " +
                                                m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH[i].MYPATH.Data.ToString());
                    }
                }
                textWriter.Close();
            }
        }

        private void OpenFile()
        {
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.FileName = "Graph";
            dlg.DefaultExt = ".text";
            dlg.Filter = "Text documents |*.txt";

            Nullable<bool> result = dlg.ShowDialog();

            if (result == true)
            {
                TextReader textReader = new StreamReader(dlg.FileName);
                String str = null;
                panelViewMain.Children.Clear();
                panelViewMainBack.Children.RemoveRange(1, panelViewMainBack.Children.Count - 1);
                m_selectIndex = 0;
                m_listMyItem = new MyItemList(panelViewMain, panelViewMainBack, this.panelViewMain);
                panelViewMain.ContextMenu = new System.Windows.Controls.ContextMenu();
                if ((str = textReader.ReadLine()) == "Point None")
                {
                    ShowTextBoxViewMain(1);
                    return;
                }

                int n = Convert.ToInt32(str);
                String[] strr;
                for (int i = 0; i < n; ++i)
                {
                    str = textReader.ReadLine();
                    strr = str.Split(' ');

                    m_listMyItem.LISTMYITEM.Add(strr[0]);
                    m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Add(new MyPoint(Convert.ToDouble(strr[1]), Convert.ToDouble(strr[2]), strr[0]));
                    panelViewMain.Children.Add(m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[i].ELL);
                    Image image = new Image();
                    image.BeginInit();
                    image.Source = new BitmapImage(new Uri("Images/" + strr[0] + ".png", UriKind.Relative));
                    image.EndInit();
                    image.Margin = new System.Windows.Thickness(Convert.ToDouble(strr[1]) - 12.5, Convert.ToDouble(strr[2]) - 12.5, 0, 0);
                    image.IsHitTestVisible = false;
                    panelViewMainBack.Children.Add(image);
                }

                if ((str = textReader.ReadLine()) == "Path None")
                {
                    return;
                }

                n += Convert.ToInt32(str);
                for (int i = m_listMyItem.LISTMYITEM.Count; i < n; ++i)
                {
                    str = textReader.ReadLine();
                    strr = str.Split(' ');
                    m_listMyItem.LISTMYITEM.Add(strr[0]);
                    m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH.Add(new MyPath(strr[3], strr[0], strr[1], strr[2]));
                    panelViewMain.Children.Add(m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH[m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH.Count - 1].MYPATH);
                }
                ShowTextBoxViewMain(1);
                textBoxResult.Clear();
                textReader.Close();
            }
        }

        private void NewFile()
        {
            TabItem tabControl = tabControlShow.SelectedItem as TabItem;
            SaveChangeWindow window = new SaveChangeWindow();
            window.ShowDialog();

            if (window.Tag.ToString() == "OK")
            {
                SaveFile();
            }
            panelViewMain.Children.Clear();
            panelViewMainBack.Children.RemoveRange(1, panelViewMainBack.Children.Count - 1);
            m_selectIndex = 0;
            m_listMyItem = new MyItemList(panelViewMain, panelViewMainBack, this.panelViewMain);
            panelViewMain.ContextMenu = new System.Windows.Controls.ContextMenu();
            ShowTextBoxViewMain(1);
            textBoxResult.Clear();

        }

        private void LoadDemo(int index)
        {
            Assembly assembly = Assembly.GetExecutingAssembly();
            Stream stream = assembly.GetManifestResourceStream("Graph.Demo.GraphDemo" + index.ToString() + ".txt");
            StreamReader streamReader = new StreamReader(stream);
            TextReader textReader = new StreamReader(stream);
            String str = null;
            panelViewMain.Children.Clear();
            panelViewMainBack.Children.RemoveRange(1, panelViewMainBack.Children.Count - 1);
            m_selectIndex = 0;
            m_listMyItem = new MyItemList(panelViewMain, panelViewMainBack, this.panelViewMain);
            panelViewMain.ContextMenu = new System.Windows.Controls.ContextMenu();
            if ((str = textReader.ReadLine()) == "Point None")
            {
                ShowTextBoxViewMain(1);
                return;
            }

            int n = Convert.ToInt32(str);
            String[] strr;
            for (int i = 0; i < n; ++i)
            {
                str = textReader.ReadLine();
                strr = str.Split(' ');

                m_listMyItem.LISTMYITEM.Add(strr[0]);
                m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Add(new MyPoint(Convert.ToDouble(strr[1]), Convert.ToDouble(strr[2]), strr[0]));
                panelViewMain.Children.Add(m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[i].ELL);
                Image image = new Image();
                image.BeginInit();
                image.Source = new BitmapImage(new Uri("Images/" + strr[0] + ".png", UriKind.Relative));
                image.EndInit();
                image.Margin = new System.Windows.Thickness(Convert.ToDouble(strr[1]) - 12.5, Convert.ToDouble(strr[2]) - 12.5, 0, 0);
                image.IsHitTestVisible = false;
                panelViewMainBack.Children.Add(image);
            }

            if ((str = textReader.ReadLine()) == "Path None")
            {
                return;
            }

            n += Convert.ToInt32(str);
            for (int i = m_listMyItem.LISTMYITEM.Count; i < n; ++i)
            {
                str = textReader.ReadLine();
                strr = str.Split(' ');
                m_listMyItem.LISTMYITEM.Add(strr[0]);
                m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH.Add(new MyPath(strr[3], strr[0], strr[1], strr[2]));
                panelViewMain.Children.Add(m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH[m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH.Count - 1].MYPATH);
            }
            ShowTextBoxViewMain(1);
            textReader.Close();
        }

        private void GRAPH_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            SaveChangeWindow window = new SaveChangeWindow();
            window.ShowDialog();
            if (window.Tag.ToString() == "OK")
            {
                SaveFile();
            }
        }

        //Chuyển đổi danh sách các điểm thành ma trận kề
        private void ListMyItem_To_Matrix()
        {
            this.Cursor = Cursors.Wait;
            int n = m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count;
            m_matrix = new int[n, n];
            for (int i = 0; i < n; ++i)
            {
                for (int j = 0; j < n; ++j)
                {
                    m_matrix[i, j] = 0;
                }
            }

            foreach (MyPath path in m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH)
            {
                int i = m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(path.NAMEFIRSTPOINT);
                int j = m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(path.NAMEENDPOINT);
                m_matrix[i, j] += 1;
                m_matrix[j, i] += 1;
            }
            this.Cursor = Cursors.Arrow;
        }

        //Duyệt theo chiều sâu
        private void DFS(int _u, ref bool[] _isExamine, ref String _str)
        {
            for (int v = 0; v < m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count; ++v)
            {
                if (_isExamine[v] == false && m_matrix[v, _u] > 0 && _u != v)
                {
                    _str += v.ToString() + " ";
                    _isExamine[v] = true;
                    DFS(v, ref _isExamine, ref _str);
                }
            }
        }

        //Duyệt theo chiều rộng
        private void BFS(int _u, ref bool[] _isExamine, ref String _str)
        {
            Queue<int> queue = new Queue<int>();
            queue.Enqueue(_u);
            _isExamine[_u] = true;
            while (queue.Count != 0)
            {
                int p = queue.Dequeue();
                for (int i = 0; i < Math.Sqrt(m_matrix.Length); ++i)
                {
                    if (m_matrix[p, i] > 0 && p != i && _isExamine[i] == false)
                    {
                        _isExamine[i] = true;
                        _str += i.ToString() + " ";
                        queue.Enqueue(i);
                    }
                }
            }
        }

        private void BFSFixForFindWay(int _u, ref bool[] _isExamine, ref int[] _formerPoint)
        {
            Queue<int> queue = new Queue<int>();
            queue.Enqueue(_u);
            _isExamine[_u] = true;
            while (queue.Count != 0)
            {
                int p = queue.Dequeue();
                for (int i = 0; i < Math.Sqrt(m_matrix.Length); ++i)
                {
                    if (m_matrix[p, i] > 0 && p != i && _isExamine[i] == false)
                    {
                        _isExamine[i] = true;
                        _formerPoint[i] = p;
                        queue.Enqueue(i);
                    }
                }
            }
        }

        private void DFSFixForFindWay(int _u, ref bool[] _isExamine, ref int[] _formerPoint)
        {
            for (int v = 0; v < m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count; ++v)
            {
                if (_isExamine[v] == false && m_matrix[v, _u] > 0 && _u != v)
                {
                    _isExamine[v] = true;
                    _formerPoint[v] = _u;
                    DFSFixForFindWay(v, ref _isExamine, ref _formerPoint);
                }
            }
        }

        //Kiểm tra xem có là chu trình Euler
        private bool isEulerCycle()
        {
            int n = (int)Math.Sqrt(m_matrix.Length);
            for (int i = 0; i < n; ++i)
            {
                int sum = 0;
                for (int j = 0; j < n; ++j)
                {
                    sum += m_matrix[i, j];
                }

                if (sum % 2 == 1)
                {
                    return false;
                }
            }

            return true;
        }

        private void EulerCycle(int _u, ref Stack<int> _cycleEucle)
        {
            Stack<int> stack = new Stack<int>();
            stack.Push(_u);
            int[,] temp_matrix = m_matrix;

            while (stack.Count != 0)
            {
                int count = stack.Count;
                int x = stack.Peek();
                int n = (int)Math.Sqrt(m_matrix.Length);

                for (int i = 0; i < n; ++i)
                {
                    if (temp_matrix[x, i] > 0)
                    {
                        stack.Push(i);
                        temp_matrix[x, i] -= 1;
                        temp_matrix[i, x] -= 1;
                        break;
                    }
                }
                if (count == stack.Count)
                {
                    stack.Pop();
                    _cycleEucle.Push(x);
                }
            }
        }

        private bool isEulerPath(ref int _startPoint)
        {
            int n = (int)Math.Sqrt(m_matrix.Length);
            int count = 0;
            for (int i = 0; i < n; ++i)
            {
                int sum = 0;
                for (int j = 0; j < n; ++j)
                {
                    sum += m_matrix[i, j];
                }

                if (sum % 2 == 1)
                {
                    _startPoint = i;
                    ++count;
                }
            }

            if (count > 2)
            {
                return false;
            }
            return true;
        }

        private void EulerPath(int[] array, int[,] matrix, int _point, TextBox _textBox)
        {
            int[] _array = new int[array.Length];
            int n = m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count;
            int[,] _matrix = new int[n, n];
            for (int i = 0; i < n; ++i)
            {
                for (int j = 0; j < n; j++)
                {
                    _matrix[i, j] = matrix[i, j];
                }
            }

            for (int i = 0; i < array.Length; ++i)
            {
                _array[i] = array[i];
            }

            for (int i = 0; i < n; ++i)
            {
                if (_matrix[_array[_point - 1], i] > 0)
                {
                    _matrix[_array[_point - 1], i] -= 1;
                    _matrix[i, _array[_point - 1]] -= 1;
                    _array[_point] = i;
                    if (_point == m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH.Count)
                    {
                        for (int j = 0; j <= m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH.Count; ++j)
                        {
                            _textBox.Text += m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[_array[j]].ELL.Name + " ->  ";
                        }
                        _textBox.Text += "DỪNG\n";
                    }
                    else
                    {
                        EulerPath(_array, _matrix, _point + 1, _textBox);
                        _matrix[_array[_point - 1], i] += 1;
                        _matrix[i, _array[_point - 1]] += 1;
                    }
                }
            }
        }

        private void HamiltonCycle(ref int _count, int[] _result, bool[] _isExamine, int[,] _matrix, int _point, TextBox _textBox)
        {
            int n = m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count;

            for (int i = 0; i < n; ++i)
            {
                if (_matrix[_result[_point - 1], i] != 0)
                {
                    if (_point == n && i == _result[0])
                    {
                        _count++;
                        for (int j = 0; j < n + 1; ++j)
                        {
                            _textBox.Text += m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[(_result[j])].ELL.Name + "  ->  ";
                        }
                        _textBox.Text += "DỪNG\n";
                        break;
                    }
                    else
                    {
                        if (_isExamine[i] == false)
                        {
                            _result[_point] = i;
                            _isExamine[i] = true;
                            HamiltonCycle(ref _count, _result, _isExamine, _matrix, _point + 1, _textBox);
                            _isExamine[i] = false;
                        }
                    }
                }
            }
        }

        private void HamiltonPath(ref int _count, int[] _result, bool[] _isExamine, int[,] _matrix, int _point, TextBox _textBox)
        {
            int n = m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count;
                for (int i = 0; i < n; ++i)
                {
                    if (_matrix[_result[_point - 1], i] != 0)
                    {
                        if (_point == n)
                        {
                            _count++;
                            for (int j = 0; j < n; ++j)
                            {
                                _textBox.Text += m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[(_result[j])].ELL.Name + "  ->  ";
                            }
                            _textBox.Text += "DỪNG\n";
                            break;
                        }
                        else
                        {
                            if (_isExamine[i] == false)
                            {
                                _result[_point] = i;
                                _isExamine[i] = true;
                                HamiltonPath(ref _count, _result, _isExamine, _matrix, _point + 1, _textBox);
                                _isExamine[i] = false;
                            }
                        }
                    }
                }
        }

        #endregion

        #region Process Show

        public void Reset()
        {
            m_listMyItem.LISTMYPOINTINLISTITEM.resetColorStroke();
            imgPlay.Source = new BitmapImage(new Uri("Images/ButtonStop.png", UriKind.Relative));
            panelbuttonPlay.Children.Clear();
            panelbuttonPlay.Children.Add(imgPlay);
        }

        public void ClearToNew()
        {
            panelViewMain.Children.Clear();
            panelViewMainBack.Children.RemoveRange(1, panelViewMainBack.Children.Count - 1);
            m_selectIndex = 0;
            m_listMyItem = new MyItemList(panelViewMain, panelViewMainBack, this.panelViewMain);
            panelViewMain.ContextMenu = new System.Windows.Controls.ContextMenu();
            ShowTextBoxViewMain(1);
        }

        public void ShowInfo()
        {
            WindowInfo window = new WindowInfo();
            window.ShowDialog();
        }

        public void Exit()
        {
            this.Close();
        }

        public void ShowTextBoxViewMain(int _index)
        {
            switch (_index)
            {
                case 0:
                    textBoxViewerMain.Clear();
                    break;
                case 1:
                    textBoxViewerMain.Foreground = Brushes.Red;
                    textBoxViewerMain.Text = "SỐ ĐIỂM: " + m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count.ToString() +
                                        "   SỐ ĐƯỜNG: " + m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH.Count.ToString();
                    break;
                default:
                    break;
            }
        }

        public void ShowTextBoxResult(int _index)
        {
            switch (_index)
            {
                case 0:
                    textBoxViewerResult.Clear();
                    break;
                case 1:
                    textBoxViewerResult.Text = "MA TRẬN KỀ"; ;
                    break;
                case 2:
                    textBoxViewerResult.Text = "TÌM KIẾM THEO CHIỀU SÂU";
                    break;
                case 3:
                    textBoxViewerResult.Text = "TÌM KIẾM THEO CHIỀU RỘNG";
                    break;
                case 4:
                    textBoxViewerResult.Text = "TÌM ĐƯỜNG ĐI GIỮA 2 ĐIỂM DÙNG DFS";
                    break;
                case 5:
                    textBoxViewerResult.Text = "TÌM ĐƯỜNG ĐI GIỮA 2 ĐIỂM DÙNG BFS";
                    break;
                case 6:
                    textBoxViewerResult.Text = "TÌM CHU TRÌNH EULER";
                    break;
                case 7:
                    textBoxViewerResult.Text = "TÌM TẤT CẢ CÁC ĐƯỜNG EULER";
                    break;
                case 8:
                    textBoxViewerResult.Text = "TÌM CHU TRÌNH HAMILTON";
                    break;
                case 9:
                    textBoxViewerResult.Text = "TÌM ĐƯỜNG HAMILTON";
                    break;
                default:
                    break;
            }
        }

        public void ShowTextBoxGuild(int index)
        {
            switch (index)
            {
                case 0:
                    textBoxGuild.Clear();
                    break;
                case 1:
                    textBoxGuild.Text = "Đang ở trạng thái xem! \n";
                    textBoxGuild.Text += "Muốn chỉnh sửa đồ thị, hãy chọn các công cụ có trong hộp công cụ.";
                    break;
                case 2:
                    textBoxGuild.Text = "Đang ở trạng thái vẽ điểm!\n";
                    textBoxGuild.Text += "Nhấn vào các khoảng trống ở màn hình chính để vẽ các điểm bạn muốn!\n";
                    textBoxGuild.Text += "Hãy vẽ các điểm có vị trí tương đối để có được 1 đồ thị đẹp!!";
                    break;
                case 3:
                    textBoxGuild.Text = "Đang ở trạng thái vẽ đường!\n";
                    textBoxGuild.Text += "Nhấn vào hai điểm bất kỳ để vẽ 1 đường thẳng nối 2 điểm!\n";
                    textBoxGuild.Text += "Nhấn vào 1 điểm, sau đó là 1 khoảng trống trên màn hình chính và cuối cùng là điểm còn lại mà bạn muốn vẽ một đường cong nối 2 điểm đó!!";
                    break;
                case 4:
                    textBoxGuild.Text = "Đang ở trạng thái vẽ vòng!!\n";
                    textBoxGuild.Text += "Nhấn vào một điểm, 2 lần ở chỗ trống trên màn hình chính và lần cuối vào chính điểm đó để vẽ 1 đường vòng!";
                    break;
                case 5:
                    textBoxGuild.Text = "Đang ở trạng thái xóa đỉnh!\n";
                    textBoxGuild.Text += "Nhấn vào 1 đỉnh để xóa đỉnh đó!";
                    break;
                case 6:
                    textBoxGuild.Text = "Đang ở trạng thái xóa cạnh!\n";
                    textBoxGuild.Text += "Nhấn chuột phải vào 1 điểm để xem dang sách các đường thẳng đi qua điểm đó.\n";
                    textBoxGuild.Text += "Chọn 1 đường thẳng mà bạn muốn xóa trong danh sách đó.";
                    break; ;
                case 7:
                    textBoxGuild.Text = "Đang ở trạng thái xóa mọi thứ!\n";
                    textBoxGuild.Text += "Xóa hết tất cả mọi thứ có trên màn hình chính.";
                    break;
                case 8:
                    textBoxGuild.Text = "Đang ở trạng thái xuất ma trận kề!\n";
                    textBoxGuild.Text += "Ma trận kề là 1 dạng biểu diễn ngắn gọn của 1 đồ thị!\n";
                    textBoxGuild.Text += "Mỗi đồ thị có 1 ma trận kề duy nhất với kích thước n x n (n là số đỉnh của đồ thị).\n";
                    textBoxGuild.Text += "Đối với đồ thị vô hướng, ma trận kề là ma trận đối xứng!";
                    break;
                case 9:
                    textBoxGuild.Text = "Đang ở trạng thái tìm kiếm theo chiều sâu!\n";
                    textBoxGuild.Text += "Có 2 phương pháp cài đặt thuật toán:\n";
                    textBoxGuild.Text += "Dùng đệ quy và khử đệ quy bằng Stack!\n";
                    textBoxGuild.Text += "Những điểm nào càng cách xa điểm xuất phát thì sẽ được duyệt càng sớm.";
                    break;
                case 10:
                    textBoxGuild.Text = "Đang ở trạng thái tìm kiếm theo chiều rộng!\n";
                    textBoxGuild.Text += "Ta cài đặt thuật toán bằng cách sử dụng Queue!\n";
                    textBoxGuild.Text += "Những điểm càng gần với điểm bắt đầu càng được duyệt sớm.";
                    break;
                case 11:
                    textBoxGuild.Text = "Đang ở trạng thái tìm đường đi bằng thuật toán DFS\n";
                    textBoxGuild.Text += "Thuật toán không có gì đặc biệt!!!";
                    break;
                case 12:
                    textBoxGuild.Text = "Đang ở trạng thái tìm đường đi bằng thuật toán BFS\n";
                    textBoxGuild.Text += "Thuật toán được áp dụng khi muốn tìm đường đi mà đi qua ít cạnh nhất có thể.";
                    break;
                case 13:
                    textBoxGuild.Text = "Đang ở trạng thái tìm chu trình EULER\n";
                    textBoxGuild.Text += "Chu trình EULER là 1 chu trình đi qua tất cả các cạnh của đồ thị.\n";
                    textBoxGuild.Text += "1 chu trình là chu trình EULER khi và chỉ khi tất cả các đỉnh của đồ thị là bậc chẵn.";
                    break;
                case 14:
                    textBoxGuild.Text = "Đang ở trạng thái tìm đường  đi EULER\n";
                    textBoxGuild.Text += "Đường đi EULER là 1 đường đi qua tất cả các cạnh của đồ thị.\n";
                    textBoxGuild.Text += "1 đường đi là đường đi EULER khi và chỉ khi đồ thị có tối đa 2 đỉnh bậc lẻ.";
                    break;
                case 15:
                    textBoxGuild.Text = "Đang ở trạng thái tìm chu trình HAMILTON\n";
                    textBoxGuild.Text += "Chu trình HAMILTON là 1 chu trình đi qua tất cả các đỉnh của đồ thị.\n";
                    textBoxGuild.Text += "Hiện nay chưa có thuật toán tối ưu để chứng minh 1 đồ thị có 1 chu trình HAMILTON.";
                    break;
                case 16:
                    textBoxGuild.Text = "Đang ở trạng thái tìm đường HAMILTON\n";
                    textBoxGuild.Text += "Đường HAMILTON là 1 đường đi qua tất cả các đỉnh của đồ thị.\n";
                    textBoxGuild.Text += "Hiện nay chưa có thuật toán tối ưu để chứng minh 1 đồ thị có đường HAMILTON.";
                    break;
            }
        }

        public void ShowMatrix()
        {
            if (m_listMyItem.LISTMYITEM.Count == 0)
            {
                MessageBox.Show("VUI LÒNG THÊM ĐIỂM VÀO MÀN HÌNH CHÍNH!");
                btn_RunGraph.IsEnabled = false;
                comboBoxFunctionGraph.SelectedIndex = 0;
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }

            ListMyItem_To_Matrix();

            imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
            panelbuttonPlay.Children.Clear();
            panelbuttonPlay.Children.Add(imgPlay);
            int n = m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count;

            textBoxResult.Text = "                      ";

            for (int i = 0; i < n; ++i)
            {
                textBoxResult.Text += m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[i].ELL.Name;
                textBoxResult.Text += "                  ";
            }

            textBoxResult.Text += "\n";

            for (int i = 0; i < n; ++i)
            {
                textBoxResult.Text += "             ";
                textBoxResult.Text += m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[i].ELL.Name;
                textBoxResult.Text += "       ";
                for (int j = 0; j < n; ++j)
                {
                    textBoxResult.Text += m_matrix[i, j].ToString();
                    int temp = 18 - m_matrix[i, j] / 10;
                    for (int k = 0; k < temp; ++k)
                    {
                        textBoxResult.Text += " ";
                    }
                }
                textBoxResult.Text += "\n";
            }
        }

        public void ShowDepthFirstSearch()
        {
            if (m_listMyItem.LISTMYITEM.Count == 0)
            {
                MessageBox.Show("VUI LÒNG THÊM ĐIỂM VÀO MÀN HÌNH CHÍNH!");
                btn_RunGraph.IsEnabled = false;
                comboBoxFunctionGraph.SelectedIndex = 0;
                textBoxResult.Clear();
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }
            MessageBox.Show("VUI LÒNG CHỌN ĐIỂM ĐỂ BẮT ĐẦU DUYỆT!");

            WindowSelectNamePoint window = new WindowSelectNamePoint();
            window.ShowDialog();

            if (window.Tag.ToString() == "none")
            {
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }

            if (m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(window.Tag.ToString()) == -1)
            {
                MessageBox.Show("XIN LỖI! KHÔNG CÓ ĐIỂM MÀ BẠN ĐÃ CHỌN TRÊN MÀN HÌNH CHÍNH");
                textBoxViewerResult.Clear();
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }
            ListMyItem_To_Matrix();

            bool[] isExamine = new bool[m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count];

            for (int i = 0; i < m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count; ++i)
            {
                isExamine[i] = false;
            }

            int index = m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(window.Tag.ToString());
            isExamine[index] = true;
            String str = null;

            textBoxResult.Text = "BẮT ĐẦU TỪ ĐIỂM: " + window.Tag.ToString() + "\n";
            m_listMyItem.LISTMYPOINTINLISTITEM.showEffect(index);
            textBoxResult.Text += "THỨ TỰ CÁC ĐIỂM ĐƯỢC DUYỆT: ";

            this.Cursor = Cursors.Wait;
            DFS(index, ref isExamine, ref str);
            this.Cursor = Cursors.Arrow;

            imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
            panelbuttonPlay.Children.Clear();
            panelbuttonPlay.Children.Add(imgPlay);
            if (str == null)
            {
                textBoxResult.Text = "\nKHÔNG CÓ ĐƯỜNG CHỨA ĐIỂM " + window.Tag.ToString();
                return;
            }
            String[] strr = str.Split(' ');

            for (int i = 0; i < strr.Length - 1; ++i)
            {
                int j = Convert.ToInt32(strr[i]);
                textBoxResult.Text += m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[j].ELL.Name + "  ->  ";
                m_listMyItem.LISTMYPOINTINLISTITEM.showEffect(j);
            }

            textBoxResult.Text += "DỪNG\n";

            textBoxResult.Text += "KẾT QUẢ:" + "\n";
            textBoxResult.Text += "CÁC ĐIỂM LIÊN THÔNG VỚI ĐIỂM " + window.Tag.ToString() + " :\n";
            for (int i = 0; i < isExamine.Length; ++i)
            {
                if (isExamine[i] == true)
                {
                    textBoxResult.Text += m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[i].ELL.Name + " ";
                }
            }
        }

        public void ShowBreadthFirstSearch()
        {
            if (m_listMyItem.LISTMYITEM.Count == 0)
            {
                MessageBox.Show("VUI LÒNG THÊM ĐIỂM VÀ ĐƯỜNG VÀO MÀN HÌNH CHÍNH");
                btn_RunGraph.IsEnabled = false;
                comboBoxFunctionGraph.SelectedIndex = 0;
                textBoxResult.Clear();
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }
            MessageBox.Show("VUI LÒNG CHỌN TÊN ĐIỂM ĐỂ BẮT ĐẦU DUYỆT");

            WindowSelectNamePoint window = new WindowSelectNamePoint();
            window.ShowDialog();

            if (window.Tag.ToString() == "none")
            {
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }

            if (m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(window.Tag.ToString()) == -1)
            {
                MessageBox.Show("XIN LỖI! KHÔNG CÓ ĐIỂM MÀ BẠN ĐÃ CHỌN TRÊN MÀN HÌNH CHÍNH");
                textBoxViewerResult.Clear();
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }
            ListMyItem_To_Matrix();

            bool[] isExamine = new bool[m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count];
            String str = null;

            for (int i = 0; i < m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count; ++i)
            {
                isExamine[i] = false;
            }

            int index = m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(window.Tag.ToString());

            textBoxResult.Text += "BẮT ĐẦU TỪ ĐIỂM " + window.Tag.ToString() + "\n";
            m_listMyItem.LISTMYPOINTINLISTITEM.showEffect(index);
            textBoxResult.Text += "THỨ TỰ CÁC ĐIỂM ĐÃ DUYỆT: ";

            this.Cursor = Cursors.Wait;
            BFS(index, ref isExamine, ref str);
            this.Cursor = Cursors.Arrow;

            imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
            panelbuttonPlay.Children.Clear();
            panelbuttonPlay.Children.Add(imgPlay);

            if (str == null)
            {
                textBoxResult.Text = "\nKHÔNG CÓ BẤT KỲ ĐƯỜNG NÀO CHỨA ĐIỂM " + window.Tag.ToString();
                return;
            }

            String[] strr = str.Split(' ');

            for (int i = 0; i < strr.Length - 1; ++i)
            {
                textBoxResult.Text += m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[Convert.ToInt32(strr[i])].ELL.Name + "  ->  ";
                m_listMyItem.LISTMYPOINTINLISTITEM.showEffect(Convert.ToInt32(strr[i]));
            }
            textBoxResult.Text += "DỪNG\n";

            textBoxResult.Text += "KẾT QUẢ:" + "\n";
            textBoxResult.Text += "NHỮNG ĐIỂM LIÊN THÔNG VỚI ĐIỂM " + window.Tag.ToString() + " :\n";
            for (int i = 0; i < isExamine.Length; ++i)
            {
                if (isExamine[i] == true)
                {
                    textBoxResult.Text += m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[i].ELL.Name + " ";
                }
            }
        }

        public void ShowFindWay(int _type)
        {
            WindowChoose2point window = new WindowChoose2point();
            window.ShowDialog();

            String str = window.Tag.ToString();

            if (str == "none")
            {
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }
            String[] strr = str.Split(' ');
            if (m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(strr[0]) == -1 ||
                m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(strr[1]) == -1)
            {
                MessageBox.Show("XIN LỖI! KHÔNG CÓ ĐIỂM MÀ BẠN ĐÃ CHỌN TRÊN MÀN HÌNH CHÍNH");
                textBoxViewerResult.Clear();
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }
            int indexFirstPoint = m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(strr[0]);
            int indexEndPoint = m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(strr[1]);

            ListMyItem_To_Matrix();

            bool[] isExamine = new bool[m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count];
            for (int i = 0; i < m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count; ++i)
            {
                isExamine[i] = false;
            }
            int[] formerPoint = new int[m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count];
            formerPoint[indexEndPoint] = -1;
            if (_type == 0)
            {
                this.Cursor = Cursors.Wait;
                DFSFixForFindWay(indexFirstPoint, ref isExamine, ref formerPoint);
                this.Cursor = Cursors.Arrow;
            }
            else
            {
                this.Cursor = Cursors.Wait;
                BFSFixForFindWay(indexFirstPoint, ref isExamine, ref formerPoint);
                this.Cursor = Cursors.Arrow;
            }

            imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
            panelbuttonPlay.Children.Clear();
            panelbuttonPlay.Children.Add(imgPlay);

            if (formerPoint[indexEndPoint] == -1)
            {
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                textBoxResult.Text += "KHÔNG CÓ DƯỜNG NỐI GIỮA " + strr[0] + " VÀ " + strr[1];
                return;
            }

            textBoxResult.Text += "ĐƯỜNG TỪ " + strr[0] + " ĐẾN " + strr[1] + "\n";
            int t = indexEndPoint;
            textBoxResult.Text += strr[0] + "  ->  ";
            m_listMyItem.LISTMYPOINTINLISTITEM.showEffect(indexEndPoint);
            while (formerPoint[t] != indexFirstPoint)
            {
                textBoxResult.Text += m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[formerPoint[t]].ELL.Name + "  ->  ";
                m_listMyItem.LISTMYPOINTINLISTITEM.showEffect(formerPoint[t]);
                t = formerPoint[t];
            }
            textBoxResult.Text += strr[1];
            m_listMyItem.LISTMYPOINTINLISTITEM.showEffect(indexFirstPoint);
        }

        public void ShowEulerCycle()
        {
            ListMyItem_To_Matrix();
            bool check;
            check = isEulerCycle();
            if (check == false)
            {
                MessageBox.Show("XIN LỖI! ĐỒ THỊ CỦA BẠN KHÔNG CHỨA CHU TRÌNH EULER");
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }

            WindowSelectNamePoint window = new WindowSelectNamePoint();
            window.ShowDialog();
            string str = window.Tag.ToString();

            if (str == "none")
            {
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }

            if (m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(window.Tag.ToString()) == -1)
            {
                MessageBox.Show("XIN LỖI! KHÔNG CÓ ĐIỂM MÀ BẠN ĐÃ CHỌN TRÊN MÀN HÌNH CHÍNH");
                textBoxViewerResult.Clear();
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }

            Stack<int> cicleEuler = new Stack<int>();
            this.Cursor = Cursors.Wait;
            EulerCycle(m_listMyItem.LISTMYPOINTINLISTITEM.SearchIndex(str), ref cicleEuler);
            this.Cursor = Cursors.Arrow;
            imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
            panelbuttonPlay.Children.Clear();
            panelbuttonPlay.Children.Add(imgPlay);

            textBoxResult.Text += "CHU TRÌNH EULER: \n";
            int n = cicleEuler.Count;
            for (int i = 0; i < n; ++i)
            {
                textBoxResult.Text += m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT[cicleEuler.Pop()].ELL.Name + "  ->  ";
            }
            textBoxResult.Text += "DỪNG";
        }

        public void ShowEulerPath()
        {
            ListMyItem_To_Matrix();
            bool check;
            int starPoint = 0;
            check = isEulerPath(ref starPoint);
            if (check == false)
            {
                MessageBox.Show("XIN LỖI! ĐỒ THỊ CỦA BẠN KHÔNG CHỨA ĐƯỜNG EULER");
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }

            int[] array = new int[m_listMyItem.LISTMYPATHINLISTITEM.LISTMYPATH.Count + 1];
            array[0] = starPoint;
            textBoxResult.Text += "TẤT CẢ CÁC ĐƯỜNG EULER CỦA ĐỒ THỊ: \n";

            this.Cursor = Cursors.Wait;
            EulerPath(array, m_matrix, 1, textBoxResult);
            this.Cursor = Cursors.Arrow;

            imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
            panelbuttonPlay.Children.Clear();
            panelbuttonPlay.Children.Add(imgPlay);
        }

        public void ShowHamiltonCycle()
        {
            ListMyItem_To_Matrix();

            if (m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count == 2 &&
                m_matrix[0,1] < 2)
            {
                textBoxResult.Text = "KHÔNG CÓ CHU TRÌNH HAMILTON TRONG ĐỒ THỊ!";
                imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
                panelbuttonPlay.Children.Clear();
                panelbuttonPlay.Children.Add(imgPlay);
                return;
            }

            int[] result = new int[m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count + 1];
            bool[] isExamine = new bool[m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count];

            for (int i = 0; i < isExamine.Length; ++i)
            {
                isExamine[i] = false;
            }
            result[0] = 0;
            isExamine[0] = true;
            int count = 0;
            this.Cursor = Cursors.Wait;
            HamiltonCycle(ref count, result, isExamine, m_matrix, 1, textBoxResult);
            this.Cursor = Cursors.Arrow;

            imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
            panelbuttonPlay.Children.Clear();
            panelbuttonPlay.Children.Add(imgPlay);
            if (count == 0)
            {
                textBoxResult.Text = "KHÔNG CÓ CHU TRÌNH HAMILTON TRONG ĐỒ THỊ!";
            }
        }

        public void ShowHamiltonPath()
        {
            ListMyItem_To_Matrix();

            int[] result = new int[m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count];
            bool[] isExamine = new bool[m_listMyItem.LISTMYPOINTINLISTITEM.LISTMYPOINT.Count];

            for (int i = 0; i < isExamine.Length; ++i)
            {
                result[i] = -1;
                isExamine[i] = false;
            }
            result[0] = 0;
            isExamine[0] = true;
            int count = 0;
            this.Cursor = Cursors.Wait;
            HamiltonPath(ref count, result, isExamine, m_matrix, 1, textBoxResult);
            this.Cursor = Cursors.Arrow;

            imgPlay.Source = new BitmapImage(new Uri("Images/ButtonPlay.png", UriKind.Relative));
            panelbuttonPlay.Children.Clear();
            panelbuttonPlay.Children.Add(imgPlay);
            if (count == 0)
            {
                textBoxResult.Text = "KHÔNG CÓ ĐƯỜNG HAMILTON TRONG ĐỒ THỊ!";
            }
        }

        #endregion

    }
}

